﻿//using System;
//using System.Collections.Generic;
//using System.Drawing;
//using System.Linq;
//using System.Net;
//using System.Text;
//using System.Windows.Forms;
//using Gecko;
//using Gecko.DOM;
//using PMC.Interfaces;
//using PMC.Scripts;
//using PMC.Structs;
//using PMC.Urls;
//using mshtml;
//using Cookie = System.Net.Cookie;
//using HtmlDocument = HtmlAgilityPack.HtmlDocument;

//namespace PMC
//{
//    public class WbrowserGecko : GeckoWebBrowser, IWbrowser
//    {
//        private readonly Timer urlTimer = new Timer();
//        private UriCollector uriCollector;

//        public int TimerInterval { get; set; }
//        public DateTime TimerElapse { get; private set; }
//        public Website CurrentWebsite { get; private set; }

//        private BrowserState state;
//        public BrowserState State
//        {
//            get { return state; }
//            private set { state = value; OnBrowserStateChanged(); }
//        }

//        public new HtmlDocument Document
//        {
//            get
//            {
//                HtmlDocument doc = new HtmlDocument();
//                doc.LoadHtml(DocumentText);
//                return doc;
//            }
//        }

//        public string DocumentText
//        {
//            get { return "<html>" + ((GeckoElement) base.Document.DocumentElement).InnerHtml + "</html>"; }
//        }

//        public void Next()
//        {
//            while (!IsHandleCreated && !Disposing)
//            {
//                CreateControl();
//                Application.DoEvents();
//            }

//            if (uriCollector.Count > 0)
//            {
//                var url = uriCollector.Next();
//                Navigate(url);
//            }
//            else
//            {
//                Stop();
//            }
//        }

//        public void Start()
//        {
//            Log.Instance.AddMessage("Webbrowser [" + GetHashCode() + "] activated");
//            State = BrowserState.Started;
//            Next();
//        }

//        public new void Stop()
//        {
//            Log.Instance.AddMessage("Webbrowser [" + GetHashCode() + "] deactivated");
//            State = BrowserState.Stopped;
//            urlTimer.Stop();
//        }

//        public WbrowserGecko(UriCollector uriCollector)
//        {
//            Initiate();
//            DocumentCompleted += WbrowserGecko_DocumentCompleted;
//            CreateWindow += WbrowserGecko_CreateWindow;
//            CreateWindow2 += WbrowserGecko_CreateWindow2;
//            urlTimer.Interval = 10000;
//            urlTimer.Tick += urlTimer_Tick;
//            this.uriCollector = uriCollector;
//        }

//        void WbrowserGecko_CreateWindow2(object sender, GeckoCreateWindow2EventArgs e)
//        {
//            e.Cancel = true;
//        }

//        void WbrowserGecko_CreateWindow(object sender, GeckoCreateWindowEventArgs e)
//        {
//            e.WebBrowser = null;
//        }

//        void urlTimer_Tick(object sender, EventArgs e)
//        {
//            urlTimer.Stop();
//            if (!IsDisposed)
//                base.Stop();
//            Next();
//        }

//        void WbrowserGecko_DocumentCompleted(object sender, EventArgs e)
//        {
//            if (IsBusy)
//                return;

//            Log.Instance.AddMessage("Navigated: " + Url);

//            CurrentWebsite = Website.WebsiteByUrl(Url);
//            var currentScript = CurrentWebsite == null ? Script.Default : CurrentWebsite.Script;
//            var handle = currentScript.Handle(this);
//            switch (handle.Handler)
//            {
//                case DocumentHandler.Wait:
//                    TimerInterval = currentScript.Interval;
//                    urlTimer.Start();
//                    break;
//                case DocumentHandler.Skip:
//                    Next();
//                    break;
//                case DocumentHandler.Reload:
//                    Reload();
//                    break;
//                case DocumentHandler.Replace:
//                    Navigate(Convert.ToString(handle.Argument0));
//                    break;
//                case DocumentHandler.Post:
//                    // Todo: use content header given in argument1 // Fix this whole thing
//                    //requestInterception = new RequestInterception { UploadBytes = Convert.ToString(handle.Argument0) };
//                    Navigate(Url);
//                    break;
//                case DocumentHandler.NoAction:
//                    break;
//            }
//            TimerElapse = DateTime.Now;   
//        }

//        public void Navigate(Uri url)
//        {
//            try
//            {
//                Navigate(url.ToString());
//            }
//            catch (Exception e)
//            {
//                Log.Instance.AddMessage(e);
//                Next();
//            }
//        }

//        public void SetCookie(Uri url, CookieCollection cookie)
//        {
//            long exp = DateTime.Now.AddMonths(1).Ticks;
//            foreach (Cookie cook in cookie)
//            {
//                CookieManager.Add(url.Host, "/", cook.Name, cook.Value, false, false, true, exp);
//            }
//        }

//        public CookieCollection GetCookies(Uri url)
//        {
//            var cookies = CookieManager.GetCookiesFromHost(url.Host.Replace("www.", String.Empty));
//            var collection = new CookieCollection();
//            while (cookies.MoveNext())
//            {
//                var current = cookies.Current;
//                collection.Add(new Cookie(current.Name, current.Value, current.Path, current.Host));
//            }
//            return collection;
//        }

//        public CookieCollection GetCookies()
//        {
//            return GetCookies(Url);
//        }

//        public event webpageChanged WebpageVisited;
//        public void OnWebpageVisited()
//        {
//            if (WebpageVisited != null)
//            {
//                WebpageVisited(CurrentWebsite, Url);
//            }
//        }

//        public event browserStateChanged BrowserStateChanged;
//        public void OnBrowserStateChanged()
//        {
//            if (BrowserStateChanged != null)
//            {
//                BrowserStateChanged(State);
//            }
//        }

//        private static void Initiate()
//        {
//            if (!Xpcom.IsInitialized)
//            {
//                //TODO make generic
//                Xpcom.Initialize(@"H:\VS Projects\2010\GeckoFX\PutXulRunnerFolderHere\xulrunner");
//                //GeckoPreferences.Load(@"C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\4kb3fbvl.default\prefs.js");
//                //GeckoPreferences.User["permissions.default.image"] = 2; //default 1
//                //GeckoPreferences.User["network.image.imageBehavior"] = 2; //default 0
//                GeckoPreferences.User["signed.applets.codebase_principal_support"] = true; //default 0
//            }
//        }
//    }
//}
